#include<stdio.h>

int choosed[10], val[10]; // choosed[i] 表示数字 i 是否被使用过， val[i] 表示第 i 位的数字

void search(int rt) { // rt 表示当前在哪一位，位从 1 开始从左往右递增
    if(rt == 10) { // rt == 10 表明我们已经确定了全部 9 个数
        int vala = val[1] * 100 + val[2] * 10 + val[3];
        int valb = val[4] * 100 + val[5] * 10 + val[6];
        int valc = val[7] * 100 + val[8] * 10 + val[9]; // 分别计算出组合出的三个数的值
        if(valb == vala * 2 && valc == vala * 3) { // 使用乘法判断可以避免除法的取整带来的问题
            printf("%d %d %d\n", vala, valb, valc);
        }
        return; // 此时这一层递归应当结束了，否则会令 rt = 11 继续递归
    }
    int i = 1;
    for(;i<=9;i++) { // 遍历这一位选的数字
        if(!choosed[i]) { // 如果这个数字用过则不能再次使用
            val[rt] = i; // 更新 val 中的数据
            choosed[i] = 1; // 更新 choosed 中的数据
            search(rt + 1);
            choosed[i] = 0; // 此时这一位为 i 的情况已经处理完了，接下里这一位会选择其他数或终止，因此应当重新标记 i 为未使用过。
        }
    }
}

int main() {
    search(1); // 从第 1 位开始递归
}